const Koa=require('koa')
const render=require('koa-art-template')
const path=require('path')
let app=new Koa();
const static=require('koa-static')

const formidable=require('koa-formidable')
app.use(formidable({           //使用表单中间件获取文件和键值对的
    uploadDir:path.resolve('./public/upload'), //上传目录
    keepExtensions:true // 保持原有后缀名
}));
const bodyParser=require('koa-bodyparser')   //只能获取键值对的中间件
app.use(bodyParser())   //使用中间件
app.listen(3001,()=>{
    console.log(3001)
})
const session=require('koa-session')
app.keys=['session']
let store={
    storage:{},
    get(key){
        return this.storage[key]
    },
    set(key,session){
        this.storage[key]=session
    },
    destroy(key){
        delete this.storage[key]
    }
}
app.use(session({store:store},app))
//下句是 视图与数据传输中间件（前台{{user}}与后台共享user）,要放需要共享的数据后面
app.use(async (ctx,next) => {
    ctx.state.user=ctx.session.user;  //本例共享ctx.session.user
    await next()  //这只是存储ctx.state.xx步骤，无论结果都要放行，否则卡在这不会往下执行
})
render(app,{
    root:path.join(__dirname,'views'),
    extname:'.html',
    debug:process.env.NODE_ENV !=='production'
})
app.use(async (ctx,next)=>{   //在处理网址前一步做抛错处理，可以做一个优雅的处理错误
    try{
        await next()    //主要是错误处理，如果没有抛来错误，当然要next()放行
    }catch(err){
        ctx.render('error',{msg:'002',err})  //做一个error错误的html页面
    }
})
//URL重写第一种：
// app.use(async (ctx,next)=>{
//     //下面是为了防止前端链接如果带有./public出错，重写url去掉pubilc后发给后台识别。控制台看是没去掉的
//     if (ctx.url.startsWith('/public')) ctx.url=ctx.url.replace('/public','');
//     await next()
// })
// URL重写更灵活第二种：
const config=require('./common/config')
app.use(require('./common/rewrite')(config))   //重写操作要在静态资源目录后面
app.use(static(path.resolve('./public')))
const router=require('./routers/router')
app.use(router.routes())
app.use(router.allowedMethods())